package com.beidu.lottery.call.common;

import java.util.Optional;

/**
 * 用户上下文
 */
public final class BaseContextHandler {

    /**
     * <a href="https://github.com/alibaba/transmittable-thread-local" />
     */
    private static final ThreadLocal<UserInfoDTO> USER_THREAD_LOCAL = new ThreadLocal<>();

    /**
     * 设置用户至上下文
     *
     * @param user 用户详情信息
     */
    public static void setUser(UserInfoDTO user) {
        USER_THREAD_LOCAL.set(user);
    }

    /**
     * 设置用户id
     *
     * @param userId 用户Id
     */
    public static void setUserId(String userId) {
        USER_THREAD_LOCAL.set(UserInfoDTO.builder().userId(userId).build());
    }

    /**
     * 设置租户id
     *
     * @param tenant 租户Id
     */
    public static void setTenant(String tenant) {
        USER_THREAD_LOCAL.set(UserInfoDTO.builder().tenant(tenant).build());
    }

    /**
     * 获取上下文中用户 ID
     *
     * @return 用户 ID
     */
    public static String getUserId() {
        UserInfoDTO userInfoDTO = USER_THREAD_LOCAL.get();
        return Optional.ofNullable(userInfoDTO).map(UserInfoDTO::getUserId).orElse(null);
    }

    /**
     * 获取上下文中租户
     *
     * @return 租户id
     */
    public static String getTenant() {
        UserInfoDTO userInfoDTO = USER_THREAD_LOCAL.get();
        return Optional.ofNullable(userInfoDTO).map(UserInfoDTO::getTenant).orElse(null);
    }

    /**
     * 获取上下文中用户手机号
     *
     * @return 用户手机号
     */
    public static String getPhone() {
        UserInfoDTO userInfoDTO = USER_THREAD_LOCAL.get();
        return Optional.ofNullable(userInfoDTO).map(UserInfoDTO::getUserId).orElse(null);
    }


    /**
     * 清理用户上下文
     */
    public static void removeUser() {
        USER_THREAD_LOCAL.remove();
    }
}